/***********************************************************************
* Copyright 2023 客户公司名称
* @URL: 
* @ProjectName: 项目名称
* @Description: 功能描述
* Modification Log :
------------------------------------------------------------------------
* Developer                   Date                   Description
* ----------------------------------------------------------------------
* name				2023-10-19      NULL 
a、使用触发器实现:当联系人新增或更新时检查联系人的【电话】是否为空,如果为空则进行提示“联系人电话不允许为空,请填写联系人电话后再进行保存!”
b、使用触发器实现:当联系人新增或更新时将联系人的【电话】更新到联系人关联的客户的【电话】上

***********************************************************************/
public with sharing class ContactTriggerHandler extends CMN_TriggerHandler{
    // 构造函数，可以进行一些初始化操作
    public ContactTriggerHandler() {
        
    }
    public override String getTriggerName(){
        return 'ContactTriggerHandler';
    }
    // 在插入之前触发的逻辑处理代码
    public override void onBeforeInsert(List<SObject> newList){
        //检查联系人的电话是否为空
        checkContactPhoneIsBlank(newList);
    }

    // 在更新之前触发的逻辑处理代码
    public override void onBeforeUpdate(List<SObject> oldList, Map<Id, SObject> oldMap, List<SObject> newList, Map<Id, SObject> newMap){
        //检查联系人的电话是否为空
        checkContactPhoneIsBlank(newList);
    }

    // 在删除之前触发的逻辑处理代码
    public override void onBeforeDelete(List<SObject> oldList, Map<Id, SObject> oldMap){    

    }
    // 在插入之后触发的逻辑处理代码
    public override void onAfterInsert(List<SObject> newList, Map<Id, SObject> newMap){
        //保存更新后的客户信息
        List<Account> updateAccounts = new List<Account>();
        //遍历添加更新联系人
        for (Contact contact : (List<Contact>)newList) {
            addAccountPhone(updateAccounts, contact.AccountId, contact.Phone);
        }
        //批量更新客户记录
        if (!updateAccounts.isEmpty()) {
            update updateAccounts;
        }
    }
    
    // 在更新之后触发的逻辑处理代码
    public override void onAfterUpdate(List<SObject> oldList, Map<Id, SObject> oldMap, List<SObject> newList, Map<Id, SObject> newMap){
        //保存更新后的客户信息
        List<Account> updateAccounts = new List<Account>();
        for (Contact contact : (List<Contact>)newList) {
            //将SObject类型转为Map
            Map<Id, Contact> oldContactMap = (Map<Id, Contact>)oldMap;
            //联系人电话和跟新之后的电话是否相同
            if (contact.Phone != oldContactMap.get(contact.Id).Phone) {
                // 添加客户
                addAccountPhone(updateAccounts, contact.AccountId, contact.Phone);
            }
        }
        //批量更新客户记录
        if (!updateAccounts.isEmpty()) {
            update updateAccounts;
        }
    }
    // 在删除之后触发的逻辑处理代码
    public override void onAfterDelete(List<SObject> oldList, Map<Id, SObject> oldMap){

    }  


    //检查联系人电话是否为空
    public void checkContactPhoneIsBlank(List<Contact> newList){
        //遍历Contact获取联系人的手机号
        for (Contact contact : newList) {
            //判断联系人电话是否为空
            if (String.isBlank(contact.Phone)) {
                contact.addError('联系人电话不能为空，请填写联系人电话再进行保存！');
            } 
        }
    }

    //添加客户
    public void addAccountPhone(List<Account> updatedAccounts, Id id, String phone) {
        //判断客户ID是否存在
        if (id != null) {
            Account account = new Account();
            account.Id = id;
            account.Phone = phone;
            updatedAccounts.add(account);
        }
    } 
}